/**
 * 货币处理工具类
 *
 *  @author 顾章华
 *
 */

const currency = {
  // 默认的货币格式
  symbol: '￥',
  // 小数点个数  默认为2位
  decimals: 2,
  // 千分位符号
  thousandsSeparator: ',',
  // 货币符号在左边
  symbolOnLeft: true,
  // 货币小数点的符号
  decimalSeparator: '.',
};
/**
 * 货币格式化工具方法
 * 12345 => $12,345.00
 *
 * @param {String} symbol        货币符号  默认为 $
 * @param {Number} decimals      小数点个数  默认为2位
 * @param {Object} options       设置对象
 *        --- options.symbolOnLeft   货币符号是否在左边显示   默认为true
 *        --- options.thousandsSeparator   千分位符号  默认为 ','
 *        --- options.spaceBetweenAmountAndSymbol   货币符号与值之间添加一个空格 默认没有空格
 *        --- options.decimalSeparator   货币中的小数点的符号  默认为 '.'
 */
export const currencyFormat = (value, symbol, decimals, options) => {
	var thousandsSeparator, symbolOnLeft, spaceBetweenAmountAndSymbol;
	var digitsRE = /(\d{3})(?=\d)/g;
	options = options || {};
	value = parseFloat(value);
	if (!isFinite(value) || (!value && value !== 0)) value = 0;
	// 设置货币符号
	symbol = symbol != null ? symbol : currency.symbol;
	// 设置小数点个数
	decimals = decimals != null ? decimals : currency.decimals;
	// 设置千分位符号  默认为 ,
	thousandsSeparator =
		options.thousandsSeparator != null ? options.thousandsSeparator : currency.thousandsSeparator;
	// 货币符号是否在左边显示
	symbolOnLeft = options.symbolOnLeft != null ? options.symbolOnLeft : currency.symbolOnLeft;
	// 设置货币符号与值之间是否有空格
	spaceBetweenAmountAndSymbol =
		options.spaceBetweenAmountAndSymbol != null ? options.spaceBetweenAmountAndSymbol : false;
	var stringified = Math.abs(value).toFixed(decimals);
	stringified = options.decimalSeparator
		? stringified.replace(currency.decimalSeparator, options.decimalSeparator)
		: stringified;
	var _int = decimals ? stringified.slice(0, -1 - decimals) : stringified;
	var i = _int.length % 3;
	var head = i > 0 ? _int.slice(0, i) + (_int.length > 3 ? thousandsSeparator : '') : '';
	// 处理货币小数点后面的个数
	var _float = decimals ? stringified.slice(-1 - decimals) : '';
	// 处理货币符号与值之间的空格
	symbol = spaceBetweenAmountAndSymbol ? (symbolOnLeft ? symbol + ' ' : ' ' + symbol) : symbol;
	symbol = symbolOnLeft
		? symbol + head + _int.slice(i).replace(digitsRE, '$1' + thousandsSeparator) + _float
		: head + _int.slice(i).replace(digitsRE, '$1' + thousandsSeparator) + _float + symbol;
	var sign = value < 0 ? '-' : '';
	return sign + symbol;
};
/**
 *  将阿拉伯数字翻译成中文的大写数字
 * @param {*} num  阿拉伯数字
 * @returns { String }  阿拉伯数字的大写数字
 * @example numberToChinese(100.1)   =>   一百点一
 */
export const numberToChinese = num => {
	var AA = new Array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十');
	var BB = new Array('', '十', '百', '仟', '萬', '億', '点', '');
	var a = ('' + num).replace(/(^0*)/g, '').split('.'),
		k = 0,
		re = '';
	for (var i = a[0].length - 1; i >= 0; i--) {
		switch (k) {
			case 0:
				re = BB[7] + re;
				break;
			case 4:
				if (!new RegExp('0{4}//d{' + (a[0].length - i - 1) + '}$').test(a[0])) re = BB[4] + re;
				break;
			case 8:
				re = BB[5] + re;
				BB[7] = BB[5];
				k = 0;
				break;
		}
		if (k % 4 == 2 && a[0].charAt(i + 2) != 0 && a[0].charAt(i + 1) == 0) re = AA[0] + re;
		if (a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k % 4] + re;
		k++;
	}

	if (a.length > 1) {
		// 加上小数部分(如果有小数部分)
		re += BB[6];
		for (var i = 0; i < a[1].length; i++) re += AA[a[1].charAt(i)];
	}
	if (re == '一十') re = '十';
	if (re.match(/^一/) && re.length == 3) re = re.replace('一', '');
	return re;
};

/**
 *  将数字转换为大写金额
 * @param {*} num  货币
 * @returns { String }  大写金额
 * @example currencyToChinese(100.1)   =>   一百零一元
 */
export const currencyToChinese = Num => {
	//判断如果传递进来的不是字符的话转换为字符
	if (typeof Num == 'number') {
		Num = new String(Num);
	}
	Num = Num.replace(/,/g, ''); //替换tomoney()中的“,”
	Num = Num.replace(/ /g, ''); //替换tomoney()中的空格
	Num = Num.replace(/￥/g, ''); //替换掉可能出现的￥字符
	if (isNaN(Num)) {
		//验证输入的字符是否为数字
		//alert("请检查小写金额是否正确");
		return '';
	}
	//字符处理完毕后开始转换，采用前后两部分分别转换
	var part = String(Num).split('.');
	var newchar = '';
	//小数点前进行转化
	for (var i = part[0].length - 1; i >= 0; i--) {
		if (part[0].length > 10) {
			return '';
			//若数量超过拾亿单位，提示
		}
		var tmpnewchar = '';
		var perchar = part[0].charAt(i);
		switch (perchar) {
			case '0':
				tmpnewchar = '零' + tmpnewchar;
				break;
			case '1':
				tmpnewchar = '壹' + tmpnewchar;
				break;
			case '2':
				tmpnewchar = '贰' + tmpnewchar;
				break;
			case '3':
				tmpnewchar = '叁' + tmpnewchar;
				break;
			case '4':
				tmpnewchar = '肆' + tmpnewchar;
				break;
			case '5':
				tmpnewchar = '伍' + tmpnewchar;
				break;
			case '6':
				tmpnewchar = '陆' + tmpnewchar;
				break;
			case '7':
				tmpnewchar = '柒' + tmpnewchar;
				break;
			case '8':
				tmpnewchar = '捌' + tmpnewchar;
				break;
			case '9':
				tmpnewchar = '玖' + tmpnewchar;
				break;
		}
		switch (part[0].length - i - 1) {
			case 0:
				tmpnewchar = tmpnewchar + '元';
				break;
			case 1:
				if (perchar != 0) tmpnewchar = tmpnewchar + '拾';
				break;
			case 2:
				if (perchar != 0) tmpnewchar = tmpnewchar + '佰';
				break;
			case 3:
				if (perchar != 0) tmpnewchar = tmpnewchar + '仟';
				break;
			case 4:
				tmpnewchar = tmpnewchar + '万';
				break;
			case 5:
				if (perchar != 0) tmpnewchar = tmpnewchar + '拾';
				break;
			case 6:
				if (perchar != 0) tmpnewchar = tmpnewchar + '佰';
				break;
			case 7:
				if (perchar != 0) tmpnewchar = tmpnewchar + '仟';
				break;
			case 8:
				tmpnewchar = tmpnewchar + '亿';
				break;
			case 9:
				tmpnewchar = tmpnewchar + '拾';
				break;
		}
		var newchar = tmpnewchar + newchar;
	}
	//小数点之后进行转化
	if (Num.indexOf('.') != -1) {
		if (part[1].length > 2) {
			// alert("小数点之后只能保留两位,系统将自动截断");
			part[1] = part[1].substr(0, 2);
		}
		for (i = 0; i < part[1].length; i++) {
			tmpnewchar = '';
			perchar = part[1].charAt(i);
			switch (perchar) {
				case '0':
					tmpnewchar = '零' + tmpnewchar;
					break;
				case '1':
					tmpnewchar = '壹' + tmpnewchar;
					break;
				case '2':
					tmpnewchar = '贰' + tmpnewchar;
					break;
				case '3':
					tmpnewchar = '叁' + tmpnewchar;
					break;
				case '4':
					tmpnewchar = '肆' + tmpnewchar;
					break;
				case '5':
					tmpnewchar = '伍' + tmpnewchar;
					break;
				case '6':
					tmpnewchar = '陆' + tmpnewchar;
					break;
				case '7':
					tmpnewchar = '柒' + tmpnewchar;
					break;
				case '8':
					tmpnewchar = '捌' + tmpnewchar;
					break;
				case '9':
					tmpnewchar = '玖' + tmpnewchar;
					break;
			}
			if (i == 0) tmpnewchar = tmpnewchar + '角';
			if (i == 1) tmpnewchar = tmpnewchar + '分';
			newchar = newchar + tmpnewchar;
		}
	}
	//替换所有无用汉字
	while (newchar.search('零零') != -1) newchar = newchar.replace('零零', '零');
	newchar = newchar.replace('零亿', '亿');
	newchar = newchar.replace('亿万', '亿');
	newchar = newchar.replace('零万', '万');
	newchar = newchar.replace('零元', '元');
	newchar = newchar.replace('零角', '');
	newchar = newchar.replace('零分', '');
	if (newchar.charAt(newchar.length - 1) == '元') {
		newchar = newchar + '整';
	}
	return newchar;
};
